package br.org.acessobrasil.portal.vista;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import br.com.goals.tableedit.TableEdit;
import br.com.goals.tableedit.model.FieldConfig;
import br.com.goals.tableedit.model.TableToHtml;
import br.com.goals.tableedit.util.Conversor;
import br.org.acessobrasil.facade.GenericFacade;
import br.org.acessobrasil.portal.Gerenciador;
import br.org.acessobrasil.portal.modelo.Conteudo;
import br.org.acessobrasil.portal.modelo.ConteudoFormatado;
import br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo;
import br.org.acessobrasil.portal.modelo.ItemConteudo;
import br.org.acessobrasil.portal.persistencia.ConteudoDaoSpring;

/**
 * Classe responsavel pela logica do Item de Conteudo
 * @author Fabio Issamu Oshiro
 *
 */
public class FormularioItemConteudo {
	private static ConteudoDaoSpring conteudoDao;
	
	public void setConteudoDao(ConteudoDaoSpring conteudoDao) {
		FormularioItemConteudo.conteudoDao = conteudoDao;
	}
	
	public ConteudoDaoSpring getConteudoDao() {
		return conteudoDao;
	}

	private static void configuraTipo(FieldConfig fieldConfig, int nuFormato) {
		
		switch (nuFormato) {
		case Gerenciador.TIPO_TEXTAREA:
			fieldConfig.displaySize = 1000;
			break;
		case Gerenciador.TIPO_NUMERO:
			fieldConfig.displaySize = 100;
			break;
		case Gerenciador.TIPO_FLASH:
			fieldConfig.displaySize = 255;
			break;
		case Gerenciador.TIPO_IMAGEM:
			fieldConfig.displaySize = 255;
			break;
		case Gerenciador.TIPO_LINK_EXTERNO_NAO_VAZIO:
			fieldConfig.displaySize = 255;
			break;
		case Gerenciador.TIPO_LINK_EXTERNO:
			fieldConfig.displaySize = 255;
			break;
		case Gerenciador.TIPO_TEXTO:
			fieldConfig.displaySize = 255;
			break;
		case Gerenciador.TIPO_RTF:
			fieldConfig.displaySize = 1000;
			fieldConfig.rtf = true;
			break;
		case Gerenciador.TIPO_DATA:
			SimpleDateFormat formatador = new SimpleDateFormat("yyyy-MM-dd");
			fieldConfig.defaultValue = formatador.format(new Date());
			break;
		default:
			fieldConfig.displaySize = 255;
		}

	}

	private static void configuraAutoComplete(FieldConfig fieldConfig, long nuFormato){
		if(nuFormato==Gerenciador.TIPO_AUTO_COMPLETE){
			if(fieldConfig.singleValue==null) fieldConfig.singleValue=""; 
			fieldConfig.htmlCampoDoFormulario="<textarea id=\""+fieldConfig.htmlName+"\" name=\""+fieldConfig.htmlName+"\" class=\"txtAutoComplete\" onkeyup=\"autocomplete(this)\">"+fieldConfig.singleValue.replace("<", "&lt;")+"</textarea><div class=\"autocompletar\"><div class=\"interno\" id=\"auto_"+fieldConfig.htmlName+"\"></div></div>";
		}
	}
	/**
	 * Cria os campos em comum entre o editar e o criar
	 * 
	 * @param tableToHtml
	 * @param itemConteudo
	 * @param conteudo2 
	 */
	private static void criarCamposItemConteudo(TableToHtml tableToHtml, ItemConteudo itemConteudo, Conteudo conteudo) {
		FieldConfig fieldTitulo = new FieldConfig();
		fieldTitulo.className = "java.lang.String";
		fieldTitulo.columnName = "no_titulo";
		fieldTitulo.htmlName = fieldTitulo.columnName;
		fieldTitulo.displayName = "T&iacute;tulo";
		fieldTitulo.defaultValue = "Digite o t&iacute;tulo";
		fieldTitulo.displaySize = 200;
		fieldTitulo.htmlCampoDoFormulario = "<input type=\"text\" id=\"" + fieldTitulo.htmlName + "\" name=\"" + fieldTitulo.htmlName + "\" value=\"" + fieldTitulo.defaultValue + "\" maxlength=\"" + fieldTitulo.displaySize + "\" accesskey=\"e\" />";
		tableToHtml.addFieldConfig(fieldTitulo);
		FieldConfig fieldPreco = new FieldConfig();
		if(conteudo.getTipoConteudo().getPossuiPreco().equals(1)){
			fieldPreco.className = "java.lang.Double";
			fieldPreco.columnName = "preco";
			fieldPreco.htmlName = fieldPreco.columnName;
			fieldPreco.displayName = "Pre&ccedil;o";
			fieldPreco.defaultValue = "Digite o pre&ccedil;o";
			tableToHtml.addFieldConfig(fieldPreco);
		}
		
		FieldConfig fieldDtParaPublicacao = new FieldConfig();
		fieldDtParaPublicacao.className = "java.sql.Date";
		fieldDtParaPublicacao.columnName = "dt_para_publicacao";
		fieldDtParaPublicacao.htmlName = fieldDtParaPublicacao.columnName;
		fieldDtParaPublicacao.displayName = "Publicar em";
		fieldDtParaPublicacao.defaultValue = "Digite a data";
		fieldDtParaPublicacao.displaySize = 200;
		tableToHtml.addFieldConfig(fieldDtParaPublicacao);

		FieldConfig fieldDtParaRetirada = new FieldConfig();
		fieldDtParaRetirada.className = "java.sql.Date";
		fieldDtParaRetirada.columnName = "dt_para_retirada";
		fieldDtParaRetirada.htmlName = fieldDtParaRetirada.columnName;
		fieldDtParaRetirada.displayName = "Retirar do ar em";
		fieldDtParaRetirada.defaultValue = "Digite a data";
		fieldDtParaRetirada.displaySize = 200;
		fieldDtParaRetirada.help = "( Para conte&uacute;do permanente colocar ano 2300 )";
		tableToHtml.addFieldConfig(fieldDtParaRetirada);
		if (itemConteudo == null) {
			/*
			 * Coloca uma hora padr�o
			 */
			SimpleDateFormat formatador = new SimpleDateFormat("yyyy-MM-dd");
			String agora = formatador.format(new Date());
			String retirada = agora.replaceAll("[0-9]{4}", "2300");
			fieldDtParaPublicacao.singleValue = agora;
			fieldDtParaRetirada.singleValue = retirada;
			fieldDtParaPublicacao.defaultValue = agora;
			fieldDtParaRetirada.defaultValue = retirada;
			
		} else {
			fieldTitulo.singleValue = itemConteudo.getNoTitulo();
			if(conteudo.getTipoConteudo().getPossuiPreco().equals(1)){
				if(itemConteudo.getPreco()!=null){
					fieldPreco.singleValue = Conversor.converteMoeda(itemConteudo.getPreco());
				}else{
					fieldPreco.singleValue = "0,00";
				}
			}
			fieldTitulo.htmlCampoDoFormulario = "<input type=\"text\" id=\"" + fieldTitulo.htmlName + "\" name=\"" + fieldTitulo.htmlName + "\" value=\"" + fieldTitulo.singleValue + "\" maxlength=\"" + fieldTitulo.displaySize + "\" accesskey=\"e\" />";
			
			if (itemConteudo.getDtParaPublicacao() != null) {
				fieldDtParaPublicacao.singleValue = itemConteudo
						.getDtParaPublicacao().toString();
			}
			if (itemConteudo.getDtParaRetirada() != null) {
				fieldDtParaRetirada.singleValue = itemConteudo
						.getDtParaRetirada().toString();
			}
			try {
				FieldConfig alteradoPor = new FieldConfig();
				alteradoPor.singleValue = itemConteudo.getAlteradoPor()
						.getNoUsuario()
						+ " em "
						+ Conversor.converteDDMMYYYY(itemConteudo
								.getDtAlteracao());
				alteradoPor.className = "java.lang.String";
				alteradoPor.displayName = "Alterado por";
				alteradoPor.setEditable(false);
				FieldConfig criadoPor = new FieldConfig();
				criadoPor.singleValue = itemConteudo.getUsuario()
						.getNoUsuario()
						+ " em "
						+ Conversor.converteDDMMYYYY(itemConteudo
								.getDtCriacao());
				criadoPor.className = "java.lang.String";
				criadoPor.displayName = "Criado por";
				criadoPor.setEditable(false);
				tableToHtml.addFieldConfig(alteradoPor);
				tableToHtml.addFieldConfig(criadoPor);
			} catch (Exception e) {
				// ok n�o h� alguma info
			}
			
		}
		
	}

	/**
	 * Cria um formulario html para adicionar um item de conteudo
	 * @param nu_conteudo
	 * @param formAction
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static String gerarFormularioHtml(Long nu_conteudo, String formAction,boolean modoDesenvolvimento) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		TableEdit tableEdit = new TableEdit();
		tableEdit.setFormAction(formAction);
		TableToHtml tableToHtml = new TableToHtml();
		tableToHtml.toAdd = true;
		if(conteudoDao==null){
			throw new RuntimeException("Configure o FormularioItemConteudo corretamente, o conteudoDao esta nulo.");
		}
		Conteudo conteudo = conteudoDao.select(nu_conteudo);
		/*
		 * Coloca o campo de t�tulo
		 */
		criarCamposItemConteudo(tableToHtml, null, conteudo);
		int countBtnEscolherArquivo = 0;
		for (InformacaoTipoConteudo info : conteudo.getTipoConteudo()
				.getListInformacaoTipoConteudo()) {
			// se o campo n�o estiver ativo pula ele.
			if (!info.getCoAtivo()) {
				continue;
			}
			String campoNome = "info" + info.getNuInformacaoTipoConteudo();
			FieldConfig fieldConfig = new FieldConfig();
			fieldConfig.className = info.getFormato().getClassName();
			fieldConfig.columnName = campoNome;
			fieldConfig.htmlName = campoNome;
			fieldConfig.displayName = info.getNoInformacao();
			fieldConfig.defaultValue = info.getDeDicaPreenchimento();
			int nuFormato = (int)info.getFormato().getNuFormato();
			configuraTipo(fieldConfig, nuFormato);
			configuraAutoComplete(fieldConfig, nuFormato);
			if (nuFormato == Gerenciador.TIPO_IMAGEM || nuFormato == Gerenciador.TIPO_FLASH || nuFormato == Gerenciador.TIPO_ARQUIVO_DOWNLOAD) {
				fieldConfig.help = "<input type=\"hidden\" name=\"redireciona"
						+ countBtnEscolherArquivo
						+ "\" value=\"listarArquivos.action?escolhendo=1&amp;itemConteudo.nuItemConteudo=0&amp;conteudo.nuConteudo="
						+ conteudo.getNuConteudo()
						+ "&amp;informacaoTipoConteudo.nuInformacaoTipoConteudo="
						+ info.getNuInformacaoTipoConteudo()
						+ "\" /><input type=\"submit\" name=\"btnEscolherArquivo"
						+ countBtnEscolherArquivo
						+ "\" value=\"escolher arquivo\" />";
				countBtnEscolherArquivo++;
			}

			if (fieldConfig.defaultValue == null
					|| fieldConfig.defaultValue.equals("")) {
				fieldConfig.defaultValue = "Preencha este campo";
			}
			tableToHtml.addFieldConfig(fieldConfig);
		}
		tableEdit.addHiddenInput("itemConteudo.nuItemConteudo","0");
		tableEdit.addHiddenInput("conteudo.nuConteudo", nu_conteudo);
		tableEdit.addHiddenInput("countBtnEscolherArquivo",
				countBtnEscolherArquivo);
		if(modoDesenvolvimento){
			tableEdit.setBtnExtra("<input type=\"submit\" value=\"Salvar Publicado\" title=\"Salva sem backup e deixa o status como publicado\" name=\"btnSalvarPublicar\" accesskey=\"s\" /> <input type=\"submit\" name=\"btnAcessibilizar\" value=\""+GenericFacade.getString("button.label.acessibilizar")+"\" />");
		}		
		tableEdit.createadd(tableToHtml);
		return tableEdit.writeForm();
	}

	/**
	 * Gera o formul�rio HTML com campos din�micos para atualizar
	 * @param itemConteudo
	 * @param action atributo action do formulario
	 * @return html
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static String gerarFormularioHtml(ItemConteudo itemConteudo,String action,boolean btnSalvarPublicar)throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		long nu_conteudo = itemConteudo.getNuConteudo();
		TableEdit tableEdit = new TableEdit();
		tableEdit.setFormAction(action);
		TableToHtml tableToHtml = new TableToHtml();
		tableToHtml.toUpd = true;
		Conteudo conteudo = conteudoDao.select(nu_conteudo);
		/*
		 * Coloca o campo de t�tulo
		 */
		criarCamposItemConteudo(tableToHtml, itemConteudo, conteudo);
		int countBtnEscolherArquivo = 0;
		for (InformacaoTipoConteudo info : conteudo.getTipoConteudo().getListInformacaoTipoConteudo()) {

			String campoNome = "info" + info.getNuInformacaoTipoConteudo();
			FieldConfig fieldConfig = new FieldConfig();
			fieldConfig.help = "";
			fieldConfig.className = info.getFormato().getClassName();
			fieldConfig.columnName = campoNome;
			fieldConfig.htmlName = campoNome;
			fieldConfig.displayName = info.getNoInformacao();
			// fieldConfig.defaultValue = info.getDe_dica_preenchimento();
			int nuFormato = (int)info.getFormato().getNuFormato();
			configuraTipo(fieldConfig, nuFormato);
			/*
			 * Colocar um valor padrao caso n�o exista
			 */
			if (fieldConfig.defaultValue == null || fieldConfig.defaultValue.equals("")) {
				fieldConfig.defaultValue = "Preencha este campo.";
			}
			/*
			 * Colocar o conte�do que j� estava no banco de dados 
			 */
			for (ConteudoFormatado conteudoFormatado : itemConteudo.getListConteudoFormatado()) {
				if (conteudoFormatado.getNuInformacaoTipoConteudo() == info.getNuInformacaoTipoConteudo()) {
					fieldConfig.singleValue = conteudoFormatado.getDeConteudo();
					if (fieldConfig.singleValue.equals("")){
						fieldConfig.singleValue = info.getDeDicaPreenchimento();
					}
					if (conteudoFormatado.getRelatorioAcessibilidade() != null) {
						fieldConfig.help += "<img src=\"images/stop.gif\" alt=\"Erros\"/>";
					}
				}
			}
			configuraAutoComplete(fieldConfig, nuFormato);
			if (nuFormato == Gerenciador.TIPO_IMAGEM || nuFormato == Gerenciador.TIPO_FLASH || nuFormato == Gerenciador.TIPO_ARQUIVO_DOWNLOAD) {
				fieldConfig.help += "<input type=\"hidden\" name=\"redireciona"
						+ countBtnEscolherArquivo
						+ "\" value=\"listarArquivos.action?escolhendo=1&amp;itemConteudo.nuItemConteudo="
						+ itemConteudo.getNuItemConteudo()
						+ "&amp;conteudo.nuConteudo="
						+ conteudo.getNuConteudo()
						+ "&amp;informacaoTipoConteudo.nuInformacaoTipoConteudo="
						+ info.getNuInformacaoTipoConteudo()
						+ "\" /><input type=\"submit\" name=\"btnEscolherArquivo"
						+ countBtnEscolherArquivo
						+ "\" value=\"escolher arquivo\" />";
				countBtnEscolherArquivo++;
			}
			if (!info.getCoAtivo() && fieldConfig.singleValue == null) {
				continue;
			}
			tableToHtml.addFieldConfig(fieldConfig);
		}
		tableEdit.addHiddenInput("conteudo.nuConteudo", nu_conteudo);
		tableEdit.addHiddenInput("itemConteudo.nuItemConteudo", itemConteudo
				.getNuItemConteudo());
		tableEdit.addHiddenInput("countBtnEscolherArquivo",
				countBtnEscolherArquivo);
		tableEdit.createadd(tableToHtml);
		  
		if(btnSalvarPublicar){
			tableEdit.setBtnExtra("<input type=\"submit\" value=\"Salvar Publicado\" title=\"Salva sem backup e deixa o status como publicado\" name=\"btnSalvarPublicar\" accesskey=\"s\" />  <input type=\"submit\" name=\"btnAcessibilizar\" value=\""+GenericFacade.getString("button.label.acessibilizar")+"\" />");
		}
		return tableEdit.writeForm();
	}
}
